package cn.wolf.netty.inboundhandlerandoutboundhandler;


import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * 自定义入栈字节码解码器
 */
public class MyByteToLongDecoder extends ByteToMessageDecoder {


    /**
     * 解码
     * decoder 会根据接收的数据,被调用多次,知道确定没有新的元素添加到list集合中,或者是ByteBuf没有可读字节为止
     * 如果list集合不为空,就会将该集合传递给下一个chandlerInboundHandler 处理,该处理器方法也会被执行多次
     * @param channelHandlerContext 上下文对象
     * @param byteBuf               入栈ByteBuf
     * @param list                  将解码的数据放到该集合中,并传递给下一个handler进行下一步处理
     * @throws Exception 异常
     */
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        System.out.println("MyByteToLongDecoder decoder 被调用!");
        // 自定义解码器处理long类型的数据,而long类型数据的字节码长度为8
        if (byteBuf.readableBytes() >= 8) {
            list.add(byteBuf.readLong());
        }
    }
}
